#!/usr/bin/expect


########################################################
# expect openssl.sh 而不是bash openssl.sh 这里着重说明一下 #
########################################################

# x509证书一般会用到三类文，key，csr，crt。
# key是私用密钥，通常是rsa算法。
# csr是证书请求文件，用于申请证书。在制作csr文件的时，必须使用自己的私钥来签署申，还可以设定一个密钥。
# crt是CA认证后的证书文，签署人用自己的key给你签署的凭证。


set hostname [lindex $argv 0]


# 1. 生成key文件
spawn openssl genrsa -des3 -out server.key 2048

expect "Enter pass phrase for server.key:"

send "123456\r"

expect "Verifying - Enter pass phrase for server.key:"

send "123456\r"

interact
# 这样是生成rsa私钥。
# des3算法，openssl格式，2048位强度。server.key是密钥文件名。为了生成这样的密钥，需要一个至少四位的密码。
# 可以通过以下方法 去除server.key的密码:
# openssl rsa -in server.key -out server.key



# 2. 生成crt文件
spawn openssl req -new -x509 -key server.key -out ca.crt -days 365

expect "Enter pass phrase for server.key:"
send "123456\r"

expect "Country Name (2 letter code) []:"
send "CN\r"

expect "State or Province Name (full name) []:"
send "Shanghai\r"

expect "Locality Name (eg, city) []:"
send "Shanghai\r"

expect "Organization Name (eg, company) []:"
send "Yunmiao Inc.\r"

expect "Organizational Unit Name (eg, section) []:"
send "development\r"

expect "Common Name (eg, fully qualified host name) []:"
send "$hostname\r"

expect "Email Address []:"
send "1341069918@qq.com\r"

interact
# 生成的ca.crt文件是用来签署下面的server.csr文件。



# 3. 生成csr文件
spawn openssl req -new -key server.key -out server.csr

expect "Enter pass phrase for server.key:"
send "123456\r"

expect "Country Name (2 letter code) []:"
send "CN\r"

expect "State or Province Name (full name) []:"
send "Shanghai\r"

expect "Locality Name (eg, city) []:"
send "Shanghai\r"

expect "Organization Name (eg, company) []:"
send "Yunmiao Inc.\r"

expect "Organizational Unit Name (eg, section) []:"
send "development\r"

expect "Common Name (eg, fully qualified host name) []:"
send "$hostname\r"

expect "Email Address []:"
send "1341069918@qq.com\r"

expect "A challenge password []:"
send "123456\r"

interact
# 需要依次输入国家，地区，组织，email。最重要的是有一个common name，可以写你的名字或者域名。如果为了https申请，这个必须和域名吻合，否则会引发浏览器警报。生成的csr文件交给CA签名后形成服务端自己的证书。




# 4. 生成crt文件
spawn openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey server.key -CAcreateserial -out server.crt

expect "Enter pass phrase for server.key:"
send "123456\r"

interact
# CSR文件必须有CA的签名才可形成证书，可将此文件发送到verisign等地方由它验证，要交一大笔钱，何不自己做CA呢。
# 输入key的密钥后，完成证书生成。
# -CA选项指明用于被签名的csr证书，-CAkey选项指明用于签名的密钥，-CAserial指明序列号文件，而-CAcreateserial指明文件不存在时自动生成。
# 最后生成了私用密钥：server.key和自己认证的SSL证书：server.crt

# 5. 证书合并
cat server.key server.crt > server.pem

# 6. 删除多余文件
rm ca.crt
rm ca.srl
rm server.csr